/*
1.什么是Promise？发布订阅模式 它是设计模式的其中一种
2.面试经常问的 其次手写这个 它的思想被人们广泛所使用的
3.有谁在用 vue2 eventBus $on监听 $emit触发（派发）
4.electron ipcRenderer（事件总线） ipcMain(通信)
5.DOM2 addEventListener removeEventListener
*/
class Emitter {
    constructor() {
        this.events = new Map();
    }
    once(event, callback) {
        // 1.创建一个自定义函数 通过on触发
        // 2.触发完之后立马通过off回收掉
        const cb = (...args) => {
            callback(...args);
            this.off(event, cb);
        };
        this.on(event, cb);
    }
    on(event, callback) {
        // 如果已经存在
        if (this.events.has(event)) {
            const calbackList = this.events.get(event);
            calbackList === null || calbackList === void 0 ? void 0 : calbackList.push(callback);
        }
        else {
            // 否则就是第一次存
            this.events.set(event, [callback]);
        }
    }
    emit(event, ...args) {
        const calbackList = this.events.get(event);
        // console.log(calbackList);
        if (calbackList && calbackList.length > 0) {
            calbackList.forEach(cb => {
                cb(...args);
            });
        }
    }
    off(event, callback) {
        const callbackList = this.events.get(event);
        if (callbackList) {
            callbackList.splice(callbackList.indexOf(callback), 1);
        }
    }
}
const bus = new Emitter();
const busFn = (b, s) => {
    console.log(1, b, s);
};
/* bus.on("message", busFn);

bus.on("off", busFn); */
bus.once("message", busFn);
bus.emit("message", false, 213213);
bus.emit("message", false, 213213);
bus.emit("message", false, 213213);
bus.emit("message", false, 213213);
bus.emit("message", false, 213213);
console.log(bus);
